package $3exceptionhandler;

public class FnCustomException {

    public static void main(String[] args) {
        /** 自定义抛出异常 Custom Exception
        * Java标准库定义的常用异常包括：
        * Exception
        * ├─ RuntimeException               运行时异常
        * │  ├─ NullPointerException            空指针
        * │  ├─ IndexOutOfBoundsException       索引超出
        * │  ├─ SecurityException               安全异常
        * │  └─ IllegalArgumentException        参数检查不合法
        * │     └─ NumberFormatException        数字格式异常
        * ├─ IOException                    IO异常
        * │  ├─ UnsupportedCharsetException     不支持的字符
        * │  ├─ FileNotFoundException           文件未找到
        * │  └─ SocketException                 网络异常
        * ├─ ParseException                 语法解析异常
        * ├─ GeneralSecurityException       一般安全异常
        * ├─ SQLException                   SQL异常
        * └─ TimeoutException               超时
        *
        * 小结
        * 抛出异常时，尽量复用JDK已定义的异常类型；
        * 自定义异常体系时，推荐从RuntimeException派生“根异常”，再派生出业务异常；
        * 自定义异常时，应该提供多种构造方法。
        */
        // 当我们在代码中需要抛出异常时，尽量使用JDK已定义的异常类型。
        process1(1);



    }
    private static void process1(int age) {
        if (age <= 0) {
            throw new IllegalArgumentException();
        }
    }

    // 在一个大型项目中，可以自定义新的异常类型，但是，保持一个合理的异常继承体系是非常重要的。
    // 一个常见的做法是自定义一个BaseException作为“根异常”，然后，派生出各种业务类型的异常。
    // BaseException需要从一个适合的Exception派生，通常建议从RuntimeException派生：

    public class BaseException extends RuntimeException {
        // 自定义的BaseException应该提供多个构造方法
        public BaseException() {
            super();
        }

        public BaseException(String message, Throwable cause) {
            super(message, cause);
        }

        public BaseException(String message) {
            super(message);
        }

        public BaseException(Throwable cause) {
            super(cause);
        }
    }
    // 其他业务类型的异常就可以从BaseException派生：
    public class UserNotFoundException extends BaseException {
    }
    public class LoginFailedException extends BaseException {
    }
}
